package server;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import java.util.Vector;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

import bean.*;


public class TestCorreo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		 // Obtener el EntityManagerFactory (poner el persistent unit del persistence.xml)
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TPCorreo");

        // Crear el EntityManager
        EntityManager em = emf.createEntityManager();
        
        //Inicio Transaccion
        EntityTransaction tx = em.getTransaction();
        tx.begin();

        //Creo una casilla
        Casilla casilla = new Casilla();
        casilla.setNombre("casilla 1");
        Casilla casilla2 = new Casilla();
        casilla2.setNombre("casilla 2");
        Casilla casilla3 = new Casilla();
        casilla3.setNombre("casilla 3");
        
        //Creo un usuario
        Usuario usuario = new Usuario();
        usuario.setNombre("Nicolas");
        //Creo otro usuario	
        Usuario usuario2 = new Usuario();
        usuario2.setNombre("Pepe");
        

        usuario.addCasilla(casilla);
        usuario.addCasilla(casilla2);
        usuario2.addCasilla(casilla3);
        
        //Creo una oficina
        Oficina oficina1 = new Oficina();
        oficina1.setNombre("oficina1");
        Oficina oficina2 = new Oficina();
        oficina2.setNombre("oficina2");
        Oficina oficina3 = new Oficina();
        oficina3.setNombre("oficina3");
        
        oficina1.addOficinaAmiga(oficina2);
        oficina1.addOficinaAmiga(oficina3);
        
        oficina1.addCasilla(casilla);
        oficina1.addCasilla(casilla2);
        oficina2.addCasilla(casilla3);
        
      //Creo un mensajes
        Mensaje msg1 = new Mensaje();
        msg1.setAsunto("Asunto1");
        msg1.setTexto("Body Mensaje 1");
        msg1.setClasificacion(Mensaje.CLASIFICACION_ALTA);
        msg1.setEstado(Mensaje.ESTADO_BORRADOR);
        msg1.setFecha(Calendar.getInstance().getTime());
        
        Mensaje msg2 = new Mensaje();
        msg2.setAsunto("Asunto2");
        msg2.setTexto("Body Mensaje 2");
        msg2.setClasificacion(Mensaje.CLASIFICACION_ALTA);
        msg2.setEstado(Mensaje.ESTADO_BORRADOR);
        msg2.setFecha(Calendar.getInstance().getTime());
        
                
        //Persisto
        em.persist(casilla);
        em.persist(casilla2);
        em.persist(casilla3);
        em.persist(usuario);
        em.persist(usuario2);
        em.persist(oficina1);
        em.persist(oficina2);
        em.persist(oficina3);
        em.persist(msg1);
        em.persist(msg2);
        
        //Commit de la Transaccion
        tx.commit();
        
        tx.begin();
        casilla.addMensaje(msg1, casilla2);
        casilla.addMensaje(msg2, casilla3);
        tx.commit();

                
        //Creo el query para obtener todas las Personas
//        Query query = em.createQuery("SELECT c FROM Casilla c");
//        Query query = em.createNativeQuery("SELECT nombre FROM Casilla");
//        String sql = "SELECT c FROM Casillas c WHERE c.USUARIO_ID=:usr_id";
        
//        String sql = "SELECT DISTINCT m FROM Casilla c JOIN c.mensajes m WHERE c.casillaId = :casillaId";
        
        String sql = "SELECT DISTINCT m FROM Casilla c JOIN c.mensajes m WHERE m.getCasillasDestino().getCasillaId IN :casillaId";
        
//        String sql = "SELECT DISTINCT o FROM Oficina o ";//JOIN o.casillas c";
//        String sql = "SELECT DISTINCT c FROM Oficina o JOIN o.casillas c WHERE o.oficinaId = :oficinaId";
        
        
	    Query query = em.createQuery(sql);
	    query.setParameter("casillaId", 2);
//	    query.setParameter("usuarioId", usuario.getUsuarioId());
	   
	                       

 
        //Ejecuto el query
//        List<Casilla> casillas = query.getResultList();
        
//        Query query2 = em.createQuery("SELECT u FROM Usuario u");
//        List<Usuario> usuarios = query2.getResultList();
        
        
        
        //Muestro los datos por la consola
//        for (Casilla c : casillas) {
//        	System.out.println("Datos Casilla:");
//        	System.out.println(c.getNombre());
//			System.out.println(c.getUsuario().getNombre());
////			for(Usuario u : usuarios){
////				System.out.println("Datos Usuario:");
////	        	System.out.println(u.getNombre());
////	        	Vector<Casilla> casillasUsuario = (Vector<Casilla>) u.getCasillas();
////	        	for(Casilla casillaUsuario : casillasUsuario)
////	        		System.out.println(casillaUsuario.getNombre());
////			}
//		}
        
        
//        List<Oficina> oficinas = query.getResultList();
//        
//      //Muestro los datos por la consola
//        for (Oficina o : oficinas) {
//        	System.out.println("Datos oficina:");
//        	System.out.println(o.getNombre());
//        	List<Oficina> oficinasAmigas = (List<Oficina>) o.getOficinasAmigas();
//        	System.out.println("Oficinas amigas:");
//        	for(Oficina oa : oficinasAmigas){
//				   System.out.println(oa.getNombre());
//			}
//		}
        
        
      //Muestro los datos por la consola
//        for (Oficina o : oficinas) {
//        	System.out.println("Datos oficina:");
//        	System.out.println(o.getNombre());
//        	List<Casilla> casillas = (List<Casilla>) o.getCasillas();
//        	System.out.println("casillas:");
//        	for(Casilla oa : casillas){
//				   System.out.println(oa.getNombre());
//			}
//		}
        
//        List<Casilla> casillas = query.getResultList();
//        System.out.println("casillas:");
//    	for(Casilla oa : casillas){
//			   System.out.println(oa.getNombre());
//		}
	    
//	    List<Oficina> oficinasAmigas = query.getResultList();
//        System.out.println("oficinas amigas:");
//    	for(Oficina oa : oficinasAmigas){
//			   System.out.println(oa.getNombre());
//		}
        
	    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy h:mm:ss a");
	    
    	List<Mensaje> mensajes = query.getResultList();
        System.out.println("mensajes:");
    	for(Mensaje m : mensajes){
    		System.out.println(m.getAsunto());
    		System.out.println(m.getTexto());
    		System.out.println(m.getClasificacion());
    		System.out.println(m.getEstado());
			System.out.println(dateFormat.format(m.getFecha()));
		}
    	

        //Cierro el EntityManager al finalizar
        em.close();
        
        //Cerrar EntityManagerFactory
        emf.close();

	}

}
